package com.hy;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:
 * User:Mr.Du
 * Date:2024/8/17
 * Time:23:36
 */
public class MinSubArrayLen {

    /**
     * 寻找长度最小的子数组，其和至少为给定目标值
     * 采用滑动窗口技巧来解决问题，通过不断调整窗口的左右边界来找到满足条件的最小子数组长度
     *
     * @param target 目标和，子数组的和至少为target
     * @param nums   整数数组，用于寻找满足条件的子数组
     * @return 返回满足条件的最小子数组长度，如果不存在则返回0
     */
    public int minSubArrayLen(int target, int[] nums) {
        // 初始化窗口的左右边界和数组长度
        int l = 0, r = 0, n = nums.length;
        // 初始化子数组的和为0
        int sum = 0;
        // 初始化结果为一个较大的数，用于记录最小子数组长度
        int res = n + 1;
        // 遍历数组，调整窗口的右边界
        while(r < n){
            // 将当前元素加入窗口的和中
            sum += nums[r];
            // 不断调整窗口的左边界，直到窗口的和减去左边界元素小于目标值
            while(sum - nums[l] >= target){
                sum -= nums[l++];
            }
            // 如果窗口的和大于等于目标值，更新最小子数组长度
            if(sum >= target){
                res = Math.min(res, r - l + 1);
            }
            // 继续调整窗口的右边界
            r++;
        }
        // 如果结果未被更新，说明不存在满足条件的子数组，返回0；否则返回结果
        return res == n + 1? 0: res;
    }

}
